package naga.x.platform2.channel.weixin.support;

import java.io.StringReader;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

/**
 * 微信订单返回
 * @author YangLi
 *
 */
public class GetOrderResponse {

//	返回结果
//	字段名	变量名	必填	类型	示例值	描述
//	返回状态码	return_code	是	String(16)	SUCCESS	
	protected String return_code;
//	SUCCESS/FAIL
//	此字段是通信标识，非交易标识，交易是否成功需要查看result_code来判断
//	返回信息	return_msg	否	String(128)	签名失败	
//	返回信息，如非空，为错误原因
//	签名失败
//	参数格式校验错误
//	以下字段在return_code为SUCCESS的时候有返回
//
//	字段名	变量名	必填	类型	示例值	描述
//	公众账号ID	appid	是	String(32)	wx8888888888888888	调用接口提交的公众账号ID
	protected String appid;
//	商户号	mch_id	是	String(32)	1900000109	调用接口提交的商户号
//	设备号	device_info	否	String(32)	013467007045764	调用接口提交的终端设备号，
//	随机字符串	nonce_str	是	String(32)	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	微信返回的随机字符串
//	签名	sign	是	String(32)	C380BEC2BFD727A4B6845133519F3AD6	微信返回的签名，详见签名算法
//	业务结果	result_code	是	String(16)	SUCCESS	SUCCESS/FAIL
	protected String result_code;
//	错误代码	err_code	否	String(32)	SYSTEMERROR	详细参见第6节错误列表
//	错误代码描述	err_code_des	否	String(128)	系统错误	错误返回的信息描述
//	以下字段在return_code 和result_code都为SUCCESS的时候有返回
//
//	字段名	变量名	必填	类型	示例值	描述
//	交易类型	trade_type	是	String(16)	JSAPI	调用接口提交的交易类型，取值如下：JSAPI，NATIVE，APP，详细说明见参数规定
	protected String trade_type;
//	预支付交易会话标识	prepay_id	是	String(64)	wx201410272009395522657a690389285100	微信生成的预支付回话标识，用于后续接口调用中使用，该值有效期为2小时
	protected String prepay_id;
//	二维码链接	code_url	否	String(64)	URl：weixin：//wxpay/s/An4baqw	trade_type为NATIVE是有返回，可将该参数值生成二维码展示出来进行扫码支付
	
	
	public GetOrderResponse() {}

	public String getReturn_code() {
		return return_code;
	}

	public void setReturn_code(String return_code) {
		this.return_code = return_code;
	}

	public String getAppid() {
		return appid;
	}

	public void setAppid(String appid) {
		this.appid = appid;
	}

	public String getResult_code() {
		return result_code;
	}

	public void setResult_code(String result_code) {
		this.result_code = result_code;
	}

	public String getTrade_type() {
		return trade_type;
	}

	public void setTrade_type(String trade_type) {
		this.trade_type = trade_type;
	}

	public String getPrepay_id() {
		return prepay_id;
	}

	public void setPrepay_id(String prepay_id) {
		this.prepay_id = prepay_id;
	}
	
	public static GetOrderResponse parse(String xml) {
		SAXBuilder builder = new SAXBuilder();
		StringReader reader = new StringReader(xml);
		try {
			Document doc = builder.build(reader);
			Element root = doc.getRootElement();
			GetOrderResponse res = new GetOrderResponse();
			res.return_code = root.getChildText("return_code");
			res.appid = root.getChildText("appid");
			res.result_code = root.getChildText("result_code");
			res.trade_type = root.getChildText("trade_type");
			res.prepay_id = root.getChildText("prepay_id");
			return res;
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			reader.close();
		}
		return new GetOrderResponse();
	}
	
	public boolean isSuccess() {
		return WeiXinApi.RESPONSE_SUCC.equals(return_code) && WeiXinApi.RESPONSE_SUCC.equals(result_code);
	}
	
	@Override
	public String toString() {
		return "GetOrderResponse [return_code=" + return_code + ", appid="
				+ appid + ", result_code=" + result_code + ", trade_type="
				+ trade_type + ", prepay_id=" + prepay_id + "]";
	}

	public static void main(String[] args) {
		String xml = "<xml>" +
		   "<return_code><![CDATA[SUCCESS]]></return_code>" +
		   "<return_msg><![CDATA[OK]]></return_msg>" +
		   "<appid><![CDATA[wx2421b1c4370ec43b]]></appid>" +
		   "<mch_id><![CDATA[10000100]]></mch_id>" +
		   "<nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>" +
		   "<sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>" +
		   "<result_code><![CDATA[SUCCESS]]></result_code>" +
		   "<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>" +
		   "<trade_type><![CDATA[JSAPI]]></trade_type>" +
		"</xml>";
		GetOrderResponse res = GetOrderResponse.parse(xml);
		System.out.println(res);
	}
	
}
